package com.spice.common.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author yinhaiming && lijinhong
 * 检查工具类，用于检查手机、邮箱等是否合法
 */
public class CheckUtil {

    /**
     * @param username 登录用户名
     * @return 是否为6~16位且必须包含字母（无论大小写）和数字
     */

    public static boolean checkUsername(String username) {

        //(?=.*[a-z])必须包含小写字母
        //(?=.*[A-Z])必须包含大写字母
        //(?=.*[a-zA-Z]) 必须包含字母
        //(?=.*\\d) 必须包含数字
        //(?=.*[~!@#$%^&*()_+`\-={}:";'<>?,.\/]) 必须包含特殊符号

        String regex = "^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{4,12}$";
        return username.matches(regex);
    }

    /**
     * @param password 密码
     * @return 是否为8~16位且必须包含字母（无论大小写）和数字
     */

    public static boolean checkPassword(String password) {

        //(?=.*[a-z])必须包含小写字母
        //(?=.*[A-Z])必须包含大写字母
        //(?=.*[a-zA-Z]) 必须包含字母
        //(?=.*\\d) 必须包含数字
        //(?=.*[~!@#$%^&*()_+`\-={}:";'<>?,.\/]) 必须包含特殊符号

        String regex = "^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,16}$";
        return password.matches(regex);
    } 

    public static Boolean isEmail(String str) {
        Boolean isEmail = false;
        String expr = "^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})$";

        if (str.matches(expr)) {
            isEmail = true;
        }
        return isEmail;
    }

    public static boolean isPhoneNumber(String phone) {
        Pattern pattern = Pattern.compile("^(13[0-9]|15[0-9]|153|15[6-9]|180|18[23]|18[5-9])\\d{8}$");
        Matcher matcher = pattern.matcher(phone);

        if (matcher.matches()) {
            return true;
        }
        return false;
    }

    public static boolean objectsHasNull(Object... objects) {
        for (Object o :
                objects) {
            if (o == null || "".equals(o.toString())) {
                return true;
            }
        }
        return false;
    }

    /**
     * @param strs 待验证格式的多个字符串
     * @return 字符串是否符合date time的格式
     */
    public static boolean isValidDateTime(String... strs) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //不允许宽松验证日期格式---- 2-29->3-1
        format.setLenient(false);
        try {
            for (String str: strs)
            {
            format.parse(str);
            }
            return true;
        } catch (ParseException e) {
            //抛出异常即证明格式不正确
            return false;
        }
    }

    /**
     * @param strs 待验证格式的多个字符串
     * @return 字符串是否符合date的格式
     */
    public static boolean isValidDate(String... strs)
    {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        //不允许宽松验证日期格式---- 2-29->3-1
        format.setLenient(false);
        try {
            for (String str: strs)
            {
                format.parse(str);
            }
            return true;
        } catch (ParseException e) {
            //抛出异常即证明格式不正确
            return false;
        }
    }
}
